package util

import (
	"sync"
	"time"
)

type I缓存token接口 interface {
	F获取token() (token string, exp int64, err error)
	F获取Tk与过期时间和锁() (string, int64, *sync.RWMutex)
}

func F获取缓存token(ii I缓存token接口) (tk string, err error) {
	//tk, exp, sy := ii.F获取Tk与过期时间和锁()
	_, _, sy := ii.F获取Tk与过期时间和锁()
	sy.RLock()
	//这里要看拿到读锁后，要不要重复获取，会不会出现
	tk, exp, _ := ii.F获取Tk与过期时间和锁()
	if tk != "" && exp > time.Now().Unix() {
		sy.RUnlock()
		return tk, nil
	} else {
		sy.RUnlock()
	}
	sy.Lock()
	tk, _, err = ii.F获取token()
	sy.Unlock()
	return
}
